#include "Circulo.h"
#include "Cuadrado.h"

Circulo::Circulo(short x, short y, short radio) : Figura(x,y)
{
	this->radio = radio;
}

Circulo::~Circulo(void)
{
}

bool Circulo::seSuperponeCon(Figura * f) {
	return f->seSuperponeCon(this);
}
// retorna true solo si el radio del circulo es mayor que la distancia del
// centro de este al cuadrado
bool Circulo::seSuperponeCon(Cuadrado * f) {
	short x = this->getX();
	if (x < f->getX1()) x = f->getX1();
	if (x > f->getX2()) x = f->getX2();
	
	short y = this->getY();
	if (y < f->getY2()) y = f->getY2();
	if (y > f->getY1()) y = f->getY1();

	double distAaristaSup = distanciaEntrePuntos(x, f->getY1(), getX(), getY());
	double distAaristaInf = distanciaEntrePuntos(x, f->getY2(), getX(), getY());
	double distAaristaIzq = distanciaEntrePuntos(f->getX1(), y, getX(), getY());
	double distAaristaDer = distanciaEntrePuntos(f->getX2(), y, getX(), getY());
	return (distAaristaSup <= radio || distAaristaInf <= radio || distAaristaIzq <= radio || distAaristaDer <= radio);
}
// retorna true solo si los radios estan a una distancia menor que la distancia entre centros
bool Circulo::seSuperponeCon(Circulo * f) {
	if (f == this) return false;
	double distanciaEntreCentros = distanciaEntrePuntos(f->getX(),f->getY(),getX(),getY());
	return (distanciaEntreCentros <= (this->radio + f->radio));
}

short Circulo::getAncho() { return radio * 2; }
short Circulo::getAlto() { return radio * 2; }
short Circulo::getXCercanoA(short x) {
	return getX();
}
short Circulo::getYCercanoA(short y) {
	return getY();
}
